---
id: Nginx配置文件
sidebar_position: 2.5
description: nginx.conf是nginx的核心配置文件，nginx的所有功能都通过该配置文件实现。
---
## nginx.conf
```conf
main    全局配置
├── worker_processes  工作进程数
├── event  配置工作模式以及连接数，是一个指令块。
├── http   http模块相关配置
│   └──  server   虚拟主机，是一个服务器。可以配置多个
│			├── listen  该虚拟主机监听端口
│       	├── upstream    集群，内网服务器，负载均衡的规则
│       	└── localtion   路由规则，表达式
│			        ├── root/alias 资源路径
│			        ├── proxy_pass 反向代理关键字
│			        └── index 首页文件名
```
1. 设置worker进程的用户，是指linux中的用户，会涉及到nginx操作目录或文件的一些权限，默认为 nobody
    ```conf
    user root;
    ```
2. worker 进程的数量设置，一般来说CPU有几个，就设置几个worker进程，或者设置为 N-1。
    ```conf
    worker_processes  1;
    ```
3. nginx 日志级别 debug|info|notice|warn|error|crit，错误级别从左到右越来越大。
    ```conf
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    ```
4. 设置nginx进程pid
    ```conf
    pid    logs/nginx.pid
    ```
5. 设置工作模式
    ```conf
    events {
    # 默认使用 epoll
    use epoll;
    # 每个worker允许连接的客户端最大连接数,配置太高会起到反作用。
    worker_connection 1024;
    }
    ```
6. http 是指令块，针对 http 网络传输的一些指令配置
    ```conf
    http {
    }
    ```
7. include 引入外部配置，提高可读性，避免单个配置文件过大
    ```conf
    include mime.types; # 请求传输的内容类型
    ```
8. 设置日志格式，main 为定义的格式名称，如此 access_log 就可以直接使用这个变量了。
    ```conf
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
   #                  '$status $body_bytes_sent "$http_referer" '
   #                  '"$http_user_agent" "$http_x_forwarded_for"';

   #access_log  logs/access.log  main;

    ```

    | 参数名| 参数意义 |
    |-|-|- |
    | $remote_addr | 客户端 ip |
    | $remote_user | 远程客户端用户名，一般为： '_' |
    | $time_local | 时间和时区 |
    | $request | 请求的url以及method |
    | $status | 响应状态码 |
    | $body_bytes_send | 响应客户端内容字节数 |
    | $http_referer | 记录用户从那个链接跳转过来的 |
    | $http_user_agent | 用户所使用的代理，一般来时都是浏览器 |
    | $http_x_forward_for | 通过代理服务器来记录客户端ip |

9. sendfile 使用高效文件传输，提高传输性能。启用后才能使用 `tcp_nopush`,s是指当数据表累积到一定大小后才发送，提高了效率。
    ```conf
    sendfile   on;
    tcp_nopush   on;
	```
10. keepalive_timeout 设置客户端与服务器请求的超时时间，保证客户端多次请求的时候不会重复建立新的连接，节约资源损耗。
    ```conf
    keepalive_timeout 65;
	```
11. gzip 启用压缩， http/js/css压缩后传输更快
    ```conf
    gzio   on; # 提高传输效率、节约带宽
    gzuo_min_length  1; #限制最小压缩，小于1字节不会压缩
    gzip_comp_level 3; # 定义压缩的级别，文件越大，压缩越多，但是cpu使用会越多
    gzip_types text/plain; #定义压缩文件的类型
	```
12. server 可以在 http 指令块中设置多个虚拟主机

    ```conf
    server {
    	listen	80; # 监听端口
    	server_name	localhost; # ip或域名
    	localtion / { # 请求路由映射，匹配拦截
    		root html; # 请求位置
    		index index.html; # 首页设置
    	}
    }
	```
## root 与 alias
### root
	假设服务器路径为：`/home/test/files/img/face.png`
	#### 2.1、root 路径完全匹配访问
	配置为：
	```conf
	location /test {
		root /home
	}
	```
用户访问的时候请求为：`url:port/test/files/img/face.png`
### alias
alias 可以为路径做一个别名，对用户透明
配置的时候为：

	```conf
	location /hello {
		alias /home/test
	}
	```
用户访问的时候请求为：`url:port/hello/files/img/face.png`,如此相当于为目录 `test` 做了一个自定义的别名。
## location 的匹配规则
* 空格： 默认匹配，普通匹配
    ```conf
    location / {
    	root /home;
    }
	```
* = :精确匹配
    ```conf
    location = /img/face.png {
    	root /home;
    }
	```
* ~* : 匹配正则表达式，不区分大小写
    ```conf
    location ~* .(GIF|jpg|png|jpeg) {
    	root /home;
    }
	```
* ~ : 匹配正则表达式，区分大小写
    ```conf
    location ~ .(GIF|jpg|png|jpeg) {
    	root /home;
    }
	```
* ^~: 以某个字符路径开头
    ```conf
    location ^~ /img {
    	root /home;
    }
	```

## Nginx的跨域
### CORS 跨域资源共享
* Cross-Origin Resource Sharing
* 允许浏览器向跨Origin的服务器发起JS请求获取响应
* 实现跨域资源共享的方式：Jsonp、SpringBoot Cors、Nginx
### Nginx的跨域支持
```conf
#允许跨域请求的域，*代表所有
add_header 'Access-Control-Allow-Origin' *;
#允许带上cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
#允许请求的方法，比如 GET/POST/PUT/DELETE
add_header 'Access-Control-Allow-Methods' *;
#允许请求的header
add_header 'Access-Control-Allow-Headers' *;
```
## Nginx 防盗链支持
```conf
#对源站点验证
valid_referers *.imooc.com;
#非法引入会进入下方判断
if ($invalid_referer) {
    return 404;
}
```

## 虚拟主机原理
原本一台服务器只能对应一个站点，通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务。

相同的端口号和相同的主机名会报错，主机名+端口号必须是唯一的。

使用域名访问的时候， 虽然是域名解析成 ip 后采取访问具体服务，但是nginx可以获取到具体的域名并将请求打到 配置了该域名的 server 上。
### serverName匹配规则
servername匹配规则分先后顺序，写在前面的匹配上就不会继续往下匹配了。
* 可以在同一serverName中匹配多个域名
* 完整匹配
* 通配符匹配
* 通配符结束匹配
* 正则匹配
## 域名解析与泛域名解析
* 域名可以解析内网
* 泛解析通过 通配符 * ，所有的解析记录都到这一个地址上

